//
// Created by wkm on 2024-04-18.
//

#ifndef AES128CHIPSYSTEMC_SHIFTROWS_H
#define AES128CHIPSYSTEMC_SHIFTROWS_H

#include "../core_module/CONSTANT.h"

SC_MODULE(shiftrows) {
    sc_in<bool> clk, reset, start;
    sc_out<exe_state> done;
    sc_in<sc_uint<DATA_SIZE>> input_data_1;
    sc_in<sc_uint<DATA_SIZE>> input_data_2;
    sc_in<sc_uint<DATA_SIZE>> input_data_3;
    sc_in<sc_uint<DATA_SIZE>> input_data_4;
    sc_in<sc_uint<DATA_SIZE>> input_data_5;
    sc_in<sc_uint<DATA_SIZE>> input_data_6;
    sc_in<sc_uint<DATA_SIZE>> input_data_7;
    sc_in<sc_uint<DATA_SIZE>> input_data_8;
    sc_in<sc_uint<DATA_SIZE>> input_data_9;
    sc_in<sc_uint<DATA_SIZE>> input_data_10;
    sc_in<sc_uint<DATA_SIZE>> input_data_11;
    sc_in<sc_uint<DATA_SIZE>> input_data_12;
    sc_in<sc_uint<DATA_SIZE>> input_data_13;
    sc_in<sc_uint<DATA_SIZE>> input_data_14;
    sc_in<sc_uint<DATA_SIZE>> input_data_15;
    sc_in<sc_uint<DATA_SIZE>> input_data_16;

    sc_out<sc_uint<DATA_SIZE>> output_data_1;
    sc_out<sc_uint<DATA_SIZE>> output_data_2;
    sc_out<sc_uint<DATA_SIZE>> output_data_3;
    sc_out<sc_uint<DATA_SIZE>> output_data_4;
    sc_out<sc_uint<DATA_SIZE>> output_data_5;
    sc_out<sc_uint<DATA_SIZE>> output_data_6;
    sc_out<sc_uint<DATA_SIZE>> output_data_7;
    sc_out<sc_uint<DATA_SIZE>> output_data_8;
    sc_out<sc_uint<DATA_SIZE>> output_data_9;
    sc_out<sc_uint<DATA_SIZE>> output_data_10;
    sc_out<sc_uint<DATA_SIZE>> output_data_11;
    sc_out<sc_uint<DATA_SIZE>> output_data_12;
    sc_out<sc_uint<DATA_SIZE>> output_data_13;
    sc_out<sc_uint<DATA_SIZE>> output_data_14;
    sc_out<sc_uint<DATA_SIZE>> output_data_15;
    sc_out<sc_uint<DATA_SIZE>> output_data_16;

    exe_state next_done;
    sc_uint<DATA_SIZE> temp_input_data[16];

    void prc_shiftrows();

    SC_CTOR(shiftrows) {
        SC_METHOD(prc_shiftrows);
        sensitive << clk.pos();

    }
};

#endif //AES128CHIPSYSTEMC_SHIFTROWS_H
